| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 
 | #include <cstdio>#define LL long long
 using namespace std;
 const int maxn = 1505;
 const LL mo = 1e9 + 7;
 LL pow(LL x, LL t){
 x %= mo; LL res = 1;
 while (t > 0){
 if (t & 1) res = 1ll * res * x % mo;
 x = 1ll * x * x % mo;
 t >>= 1;
 }
 return res;
 }
 int n, m, k, A, B;
 LL P, p[maxn], sp[maxn], fac[maxn * 100], inv[maxn * 100];
 LL C(int n, int m){
 if (m == 0 || m == n) return 1;
 if (m > n) return 0;
 return fac[n] * inv[m] % mo * inv[n - m] % mo;
 }
 LL sf[maxn][maxn], ssf[maxn][maxn];
 int main(){
 scanf("%d%d%d%d%d", &n, &m, &A, &B, &k);
 P = 1ll * A * pow(B, mo - 2) % mo; fac[0] = 1;
 for (int i = 1; i <= k; i++) fac[i] = 1ll * fac[i - 1] * i % mo;
 inv[k] = pow(fac[k], mo - 2); for (int i = k - 1; i >= 0; i--) inv[i] = 1ll * inv[i + 1] * (i + 1) % mo;
 
 for (int j = 0; j <= m; j++) p[j] = 1ll * pow(P, j) * pow(1 + mo - P, k - j) % mo * C(k, j) % mo;
 sp[0] = p[0]; for (int j = 1; j <= m; j++) sp[j] = (sp[j - 1] + p[j]) % mo;
 sf[0][m] = ssf[0][m] = 1;
 for (int T = 1; T <= n; T++){
 int S = 0;
 for (int j = 1; j <= m; j++){
 S = (S + 1ll * ssf[T - 1][j - 1] * p[j - 1] % mo) % mo;
 sf[T][j] = (sf[T][j] + mo + 1ll * sp[j - 1] * p[m - j] % mo * (ssf[T - 1][m] - ssf[T - 1][m - j]) % mo) % mo;
 sf[T][j] = (sf[T][j] + mo - 1ll * S * p[m - j] % mo) % mo;
 ssf[T][j] = (ssf[T][j - 1] + sf[T][j]) % mo;
 }
 }
 printf("%lld\n", ssf[n][m]);
 return 0;
 }
 
 |